package com.kaithan.framework.common.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 类描述：系统基础的一些枚举类统一管理维护
 *
 * @author ZhuYin
 * @since 2024年11月18日
 */
public class BaseEnums {

    /**
     * 类描述：环境枚举类
     *
     * @author ZhuYin
     * @since 2025年02月20日
     */
    @Getter
    @AllArgsConstructor
    public enum Envs {
        /** 预置环境枚举 */
        local("本地环境"),
        dev("开发环境"),
        test("测试环境"),
        uat("用户验收测试环境"),
        prod("生产环境");

        private final String desc;

        /**
         * 根据 namespace 获取对应的环境
         *
         * @param namespace 配置中的 namespace 值
         * @return 对应的环境枚举，如果找不到则返回 UNKNOWN
         */
        public static Envs fromNamespace(String namespace) {
            for (Envs envs : values()) {
                if (envs.name().equalsIgnoreCase(namespace)) {
                    return envs;
                }
            }
            // 如果找不到匹配的环境，返回 null
            return null;
        }

        /**
         * 判断是否为指定环境
         *
         * @param namespace 配置中的 namespace 值
         * @param targetEnvs 目标环境
         * @return 是否匹配
         */
        public static boolean isEnvironment(String namespace, Envs targetEnvs) {
            Envs currentEnvs = fromNamespace(namespace);
            return currentEnvs != null && currentEnvs.equals(targetEnvs);
        }

        @Override
        public String toString() {
            return this.name();
        }
    }


    @Getter
    @AllArgsConstructor
    public enum DelFlag {
        /*删除标识枚举*/
        NORMAL("0", "正常"),
        DELETED("1", "删除"),
        ;

        private final String code;
        private final String desc;

        public static String getDesc(String code) {
            for (DelFlag item : DelFlag.values()) {
                if (item.getCode().equals(code)) {
                    return item.getDesc();
                }
            }
            return "";
        }

        @Override
        public String toString() {
            return this.getCode();
        }
    }

    @Getter
    @AllArgsConstructor
    public enum YesOrNo {
        /** 是否枚举 */
        YES("Y", "是"),
        NO("N", "否"),
        ;

        private final String code;
        private final String desc;

        public static String getDesc(String code) {
            for (YesOrNo item : YesOrNo.values()) {
                if (item.getCode().equals(code)) {
                    return item.getDesc();
                }
            }
            return "";
        }

        @Override
        public String toString(){
            return this.getCode();
        }
    }

    @Getter
    @AllArgsConstructor
    public enum DictType {
        /** 字典类型枚举 */
        directory("目录结构类型，用于构建树形结构，允许有子节点"),
        group("枚举分组类型，表示一组枚举的父节点，其子节点项就是该枚举的枚举项"),
        groupItem("枚举分组项，枚举分组类型的子节点类型，表示该枚举的枚举项"),
        toggle("开关类型，值字段可以存储开关开启时的参数"),
        keyValue("常规键值对类型，用于存储简单的键值对数据"),

        ;

        private final String desc;

        public static String getDesc(String dictType) {
            for (DictType item : DictType.values()) {
                if (item.name().equals(dictType)) {
                    return item.getDesc();
                }
            }
            return "";
        }

        @Override
        public String toString() {
            return this.name();
        }
    }

    @Getter
    @AllArgsConstructor
    public enum EnableStatus {
        /*启用状态枚举*/
        enabled("enabled", "启用"),
        disabled("disabled", "禁用"),
        ;

        private final String code;
        private final String desc;

        public static String getDesc(String code) {
            for (EnableStatus item : EnableStatus.values()) {
                if (item.getCode().equals(code)) {
                    return item.getDesc();
                }
            }
            return "";
        }

        @Override
        public String toString() {
            return this.getCode();
        }
    }

    @Getter
    @AllArgsConstructor
    public enum OrganType {
        /*组织类型枚举*/
        institution("institution", "机构"),
        department("department", "部门"),
        ;

        private final String code;
        private final String desc;

        public static String getDesc(String code) {
            for (OrganType item : OrganType.values()) {
                if (item.getCode().equals(code)) {
                    return item.getDesc();
                }
            }
            return "";
        }

        @Override
        public String toString() {
            return this.getCode();
        }
    }

    @Getter
    @AllArgsConstructor
    public enum SysRoleType {
        /*系统角色枚举*/
        superAdmin("superAdmin", "超级管理员"),
        admin("admin", "系统管理员"),
        securityAdmin("securityAdmin", "安全保密员"),
        securityAuditor("securityAuditor", "安全审计员"),
        archivist("archivist", "档案管理员"),
        partTimeArchivist("partTimeArchivist", "兼职档案员"),
        user("user", "普通用户"),

        ;

        private final String code;
        private final String desc;

        public static String getDesc(String code) {
            for (SysRoleType item : SysRoleType.values()) {
                if (item.getCode().equals(code)) {
                    return item.getDesc();
                }
            }
            return "";
        }

        @Override
        public String toString() {
            return this.getCode();
        }
    }

    @Getter
    @AllArgsConstructor
    public enum FileType {
        /** 文件类型枚举 */
        word("word文件"),
        excel("excel文件"),
        ppt("ppt文件"),
        pdf("pdf文件"),
        zip("压缩文件"),

        // ... TODO 补充其他所需的文件类型

        ;
        private final String desc;
    }

    @Getter
    @AllArgsConstructor
    public enum ExtHeader {
        /** 扩展的请求头字段枚举，即请求头中允许添加的字段枚举(为保障安全性) */
        contentType("Content-Type"),
        requestWith("x-requested-with"),
        requestId("X-Request-Id"),
        authorization("Authorization"),
        saToken("sa-token"),
        queryMap("queryMap"),

        ;

        private final String fieldName;

        @Override
        public String toString() {
            return this.name();
        }

        /**
         * 方法说明：获取本系统允许使用的请求头字段集，多个使用逗号分隔
         *
         * @return 返回允许使用的请求头字段集
         * @author ZhuYin
         * @since 2025年02月20日
         */
        public static String allowedHeaders() {
            StringBuilder sb = new StringBuilder();
            for (ExtHeader item : ExtHeader.values()) {
                sb.append(item.getFieldName()).append(",");
            }
            return sb.toString();
        }

    }

}
